package com.mfn.sportjava.controller;

import com.mfn.sportjava.knowledge.model.KnowledgeEntry;
import com.mfn.sportjava.knowledge.service.KnowledgePersistenceService;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author Anyang
 * @version 1.0.0
 * @date 2025/04/16 11:04:28
 * @description 用于管理知识库条目的后台管理控制器
 * @className java.lang.String
 */
@RestController
@RequestMapping("/knowledge")
@RequiredArgsConstructor
public class KnowledgeAdminController {

    private static final Logger log = LoggerFactory.getLogger(KnowledgeAdminController.class);
    private final KnowledgePersistenceService knowledgePersistenceService;

    /**
     * 添加一个新的或多个知识条目。
     * @param entries 从请求体接收的 KnowledgeEntry JSON 列表数据。
     * @return 成功时返回创建的条目列表，失败时返回错误信息。
     */
    @PostMapping("/add")
    public ResponseEntity<?> addKnowledgeEntries(@RequestBody List<KnowledgeEntry> entries) {
        if (entries == null || entries.isEmpty()) {
            return ResponseEntity.badRequest().body("请求体不能为空或空列表");
        }
        log.info("收到批量添加知识条目的请求，数量: {}", entries.size());

        try {
            // 检查每个条目是否包含必要的字段
            List<String> invalidKeys = entries.stream()
                    .filter(entry -> entry.getMatchKey() == null || entry.getMatchKey().isBlank() ||
                            entry.getContent() == null || entry.getContent().isBlank())
                    .map(entry -> entry.getMatchKey() != null ? entry.getMatchKey() : "未知Key")
                    .collect(Collectors.toList());

            if (!invalidKeys.isEmpty()) {
                log.warn("批量添加请求中包含无效条目 (缺少 MatchKey 或 Content): {}", invalidKeys);
                return ResponseEntity.badRequest().body("部分条目缺少 MatchKey 或 Content: " + String.join(", ", invalidKeys));
            }

            // 调用 Service 层进行批量保存/更新
            List<KnowledgeEntry> savedEntries = knowledgePersistenceService.saveOrUpdateKnowledgeBatch(entries);
            log.info("成功批量添加/更新知识条目，处理数量: {}", savedEntries.size());
            // 返回成功创建的状态码和保存后的实体列表
            return ResponseEntity.status(HttpStatus.CREATED).body(savedEntries);

        } catch (IllegalArgumentException | DataIntegrityViolationException e) {
            // 处理业务逻辑错误
            log.warn("批量添加知识条目失败: {}", e.getMessage());
            return ResponseEntity.badRequest().body("批量添加失败: " + e.getMessage());
        } catch (Exception e) {
            // 处理其他意外错误
            log.error("批量添加知识条目时发生内部错误: {}", e.getMessage(), e);
            return ResponseEntity.internalServerError().body("服务器内部错误，请稍后重试");
        }
    }

    /**
     * 更新现有的知识条目 (通过 ID)。
     * @param id 要更新的条目的 ID。
     * @param updatedEntry 包含更新信息的 KnowledgeEntry JSON 数据。
     * @return 成功时返回更新后的条目，失败时返回错误信息。
     */
    @PutMapping("/update/{id}")
    public ResponseEntity<?> updateKnowledgeEntry(@PathVariable Long id, @RequestBody KnowledgeEntry updatedEntry) {
        log.info("收到更新知识条目 ID {} 的请求", id);
        try {
            // 确保传入的 ID 和请求体中的 ID (如果存在) 一致
            if (updatedEntry.getId() != null && !updatedEntry.getId().equals(id)) {
                return ResponseEntity.badRequest().body("路径 ID 和请求体 ID 不匹配");
            }
            updatedEntry.setId(id); // 确保设置了 ID 以便 JPA 执行更新

            // 调用 Service 层进行保存
            KnowledgeEntry savedEntry = knowledgePersistenceService.saveOrUpdateKnowledge(updatedEntry);
            log.info("成功更新知识条目: ID={}", savedEntry.getId());
            return ResponseEntity.ok(savedEntry);

        } catch (IllegalArgumentException | DataIntegrityViolationException e) {
            log.warn("更新知识条目 ID {} 失败: {}", id, e.getMessage());
            return ResponseEntity.badRequest().body("更新失败: " + e.getMessage());
        } catch (Exception e) {
            log.error("更新知识条目 ID {} 时发生内部错误: {}", id, e.getMessage(), e);
            return ResponseEntity.internalServerError().body("服务器内部错误，请稍后重试");
        }
    }
}